package com.scheduler.actor.strategy;

import com.scheduler.servicediscover.Worker;

import java.util.List;

/**
 * 轮询策略
 */
public class RoundRobinRouterStrategy implements RouterStrategy {

    /**
     * 这里不考虑多线程情况，因为正常任务分发都是单线程分发，但即便有多线程出现，也只是不那么轮询，存在一定误差，实际不影响，无需使用Atomic
     */
    private int tick = 0;

    @Override
    public Worker next(List<Worker> workerList, String localhostIp) {
        if (workerList == null || workerList.size() <= 0) {
            return null;
        }
        if (workerList.size() == 1) {
            return workerList.get(0);
        }
        // 避免值过大，防止溢出，当然，这会在边界处导致不是轮询的，略有误差
        int index = (tick++ > 60000 ? tick = 0 : tick) % workerList.size();
        // 轮询所有服务器的IP地址
        return workerList.get(index);
    }
}
